/*
 * Modelo.h
 *
 *  Created on: 02/09/2012
 *      Author: rodrigo
 */

#ifndef MODELO_H_
#define MODELO_H_

#include <vector>

#include "../../Modelo/ObjetosJuego/FabricasObjetosJuego.h"
#include "../../Modelo/ObjetosJuego/Personajes/TiposPersonaje.h"
#include "../../Modelo/ObjetosJuego/Obstaculos/TiposObstaculos.h"
#include "../../Modelo/ObjetosJuego/Princesa/TipoPrincesa.h"
#include "../../Modelo/ObjetosJuego/Bonus/TiposBonus.h"
#include "../../Modelo/ObjetosJuego/Enemigos/TiposEnemigos.h"
#include "../../Modelo/Nivel/Nivel.h"
#include "../../Modelo/Pantalla/Pantalla.h"
#include "../../Utils/YamlParser.h"
#include "../../Utils/Logger.h"

using namespace std;

class Modelo {

	protected:
	
		vector<Personaje*> v_personajes;
		vector<ObjetoMovible*> v_movibles;
		vector<ObjetoEstatico*> v_estaticos;
		vector<Obstaculo*> v_obstaculos;
		vector<CajaPow*> v_cajaPow;
		Princesa* princesa;
		
		Pantalla *pantalla;	    
	    Nivel *nivel;

	public:

	    Modelo (vector<Personaje*> personajes, vector<Obstaculo*> objetos, Personaje *jugador, int velocidadPersonaje, int alto, int ancho, string n_imagen, int n_alto, int n_ancho, int scroll);
	    Modelo(Juego juego, string nivel);
		virtual ~Modelo();

		vector<Personaje*> getListaPersonajes();
		vector<Obstaculo*> getListaObstaculos();

		Pantalla* getPantalla();
		void setPantalla(Pantalla *pantalla);

		int getVelocidadPersonaje();

		Nivel* getNivel();

		void addPersonaje(Personaje* personaje);
		void addObstaculo( Obstaculo obs);
		void cargarObstaculos(Nivel_y nivel, vector<Template_y> templates, vector<TipoObstaculo_y> tiposObstaculo);
		void cargarBonus(vector <TipoBonus_y> tiposBonus);
		void cargarPersonajes(Nivel_y nivel, vector<TipoPersonaje_y> tiposPersonaje, vector <TipoEnemigo_y> tiposEnemigos, TipoPrincesa_y princesa);
		
		void ActualizarEstaticos();
		void ActualizarMovibles();
		void ActualizarPersonajes();
		
		vector< pair < pair<idImagen_t, int> , Punto> > getDibujablesObstaculos(Uint32 t_juego);
		vector< pair < pair<idImagen_t, int> , Punto> > getDibujablesEstaticos(Uint32 t_juego);
		vector< pair < pair<idImagen_t, int> , Punto> > getDibujablesMovibles(Uint32 t_juego);
		vector< pair < pair<idImagen_t, int> , Punto> > getDibujablesPersonajes(vector<Personaje*> personajes, Uint32 t_juego);
		
		vector< pair<vector< pair<int, int> >, Punto> > getSonidosPersonajes(vector<Personaje*> personajes);
		
		string armarPaqueteObstaculos();
		string armarPaqueteObjetos(vector< pair < pair<idImagen_t, int> , Punto> > dibujablesEstaticos,
							vector< pair < pair<idImagen_t, int> , Punto> > dibujablesMovibles);
		string armarPaquetePersonajes(vector< pair < pair<idImagen_t, int> , Punto> > dibujablesPersonajes);
		string armarPuntajes(vector<Personaje*> personajes);
		
		string armarSonidos(vector< pair<vector< pair<int, int> >, Punto> > sonidos);
		
		bool EsFinJuego();
		string getNombreGanador();
};

#endif /* MODELO_H_ */
